from numpy import (
    empty,
    ndarray,  # 创建空数组
    sqrt,  # 计算平方根
)
from numpy.linalg import (
    norm,  # 计算向量的范数
)


def mrc_precoder_normalized(
        channel_matrix,  # 信道矩阵，表示用户和卫星天线之间的信道状态
        power_constraint_watt: float,  # 功率约束，单位为瓦特
) -> ndarray:
    """
    计算归一化的最大比率合并（MRC）预编码矩阵。

    参数:
    - channel_matrix: 信道矩阵，大小为 (用户数量, 卫星天线数量)
    - power_constraint_watt: 功率约束，单位为瓦特

    返回:
    - ndarray: 归一化的MRC预编码矩阵，大小为 (卫星天线数量, 用户数量)
    """

    user_nr = channel_matrix.shape[0]  # 用户数量
    sat_tot_ant_nr = channel_matrix.shape[1]  # 总天线数量（所有卫星）

    # 创建一个空的预编码矩阵，大小为 (卫星天线数量, 用户数量)
    w_mrc = empty((sat_tot_ant_nr, user_nr), dtype='complex')

    for user_id in range(user_nr):
        # 提取第 user_id 个用户的信道向量
        H_k = channel_matrix[user_id, :]

        # 计算最大比率合并（MRC）预编码向量
        # 使用信道向量的共轭转置，并对其进行归一化
        # 计算归一化因子 = 1 / 信道向量的范数
        # 乘以功率约束的平方根得到最终的预编码向量
        w = (1 / norm(H_k)) * H_k.conj().T * sqrt(power_constraint_watt)

        # 将计算得到的预编码向量赋值到预编码矩阵的对应列
        w_mrc[:, user_id] = w

    return w_mrc
